import { $C } from '@/utils/constants';

const regPhone = /^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][0-9]))[0-9]{8}$/;
export const testPhone = phone => regPhone.test(phone);

// 字节长度
// eslint-disable-next-line no-control-regex
export const typeLength = str => String(str).replace(/[^\u0000-\u00ff]/g, 'aa').length;

// 手机号验证
export const phone = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('请输入手机号'));
  else if (!testPhone(value)) callback(new Error('无效的手机号'));
  else callback();
};

// 密码验证
let vPassword = '';
export const password = (rules, value, callback) => {
  vPassword = value; // 保存密码，用于密码确认
  if (!value) callback(new Error('密码不能为空'));
  else if (value.length < 6) callback(new Error('密码至少6位'));
  else callback();
};

// 确认密码
export const rePassword = (rules, value, callback) => {
  if (value !== vPassword) callback(new Error('两次输入密码不一致'));
  else callback();
};

// 验证码验证
export const code = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('请输入验证码'));
  else callback();
};

// 昵称验证
export const nickname = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('昵称不能为空'));
  else if (typeLength(value) > 60) callback(new Error('昵称不能超过30个字'));
  else callback();
};

// 性别
export const gender = (rules, value, callback) => {
  if (![0, 1].includes(value)) callback(new Error('请选择您的性别'));
  else callback();
};

// 问题标题
export const issueTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('问题标题不能为空'));
  else if (value.trim().length > 100) callback(new Error('问题标题长度不能大于100'));
  else callback();
};

// 贡献标题
export const contributionTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('请填写贡献标题'));
  else callback();
};

// 内容
export const content = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('内容不能为空'));
  else callback();
};

// 空间名
export const spaceTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('空间名不能为空'));
  else callback();
};

// 群组名
export const groupTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('群组名不能为空'));
  else if (typeLength(value) > 60) callback(new Error('群组名不能超过30个字'));
  else callback();
};

// 资源标题
export const docTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('资源标题不能为空'));
  else if (value.indexOf('/') > -1) callback(new Error("资源标题不能包含 ' / '"));
  else if (value.length > 100) callback(new Error('资源标题不能超过100个字符'));
  else callback();
};

// 资源附件
export const attaches = (rules, value, callback) => {
  const isUploading = value.map(val => val.status === 'success').includes(false);
  if (isUploading) callback(new Error('附件未上传完成，请等待'));
  else callback();
};

// 单独上传文件
export const uploads = (rules, value, callback) => {
  const isUploading = value.map(val => val.status === 'success').includes(false);
  if (value.length === 0) callback(new Error('请选择要上传的文件'));
  else if (isUploading) callback(new Error('文件未上传完成，请等待'));
  else callback();
};

// 标签
export const tags = (rules, value, callback) => {
  if (value.length < 1) callback(new Error('请至少添加一个标签'));
  else callback();
};

// 富文本转纯文本
const imgReg = new RegExp('<img.+?>', 'g');
const tagReg = new RegExp('<.+?>', 'g');
export const plainText = richText => (richText ? richText.replace(imgReg, '[image]').replace(tagReg, '') : '');

// 获取正确的积分类型
export const initScoreType = (action, voteState) => {
  const scoreType = $C.score.default;
  switch (action) {
    case 'like': // 点赞积分
      return voteState ? scoreType.like : scoreType.likeCancel;
    case 'dislike': // 点踩积分
      return voteState ? scoreType.dislike : scoreType.dislikeCancel;
    default: return undefined;
  }
};

// 社区名
export const communityTitle = (rules, value, callback) => {
  if (!value) callback(new Error('社区名不能为空'));
  else if (value.length > 20) callback(new Error('社区名不能超过20个字符'));
  else callback();
};

// 通用标题
export const title = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('标题不能为空'));
  else if (typeLength(value) > 60) callback(new Error('标题不能超过30个字'));
  else callback();
};

// 分类
export const type = (rules, value, callback) => {
  if (!value) callback(new Error('请选择分类'));
  else callback();
};

// 目录名
export const folderTitle = (rules, value, callback) => {
  if (!value || !value.trim()) callback(new Error('目录名不能为空'));
  else if (value.indexOf('/') > -1) callback(new Error("目录名不能包含 ' / '"));
  else if (typeLength(value) > 40) callback(new Error('目录名不能超过20个字'));
  else callback();
};

// 处理在url中放数组获取参数，当数组只有一个值时不识别
export const formatSingleTag = (value) => {
  if (typeof value === 'string') return [value];
  return value;
};
